\documentclass[12pt]{ctexartutf8}
\usepackage{CJKutf8}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\DeclareGraphicsRule{.png}{.eps}{.bb}{}
\usepackage[unicode,dvipdfm]{hyperref}
\usepackage{multicol}

%%-----------------------------------------------------
\author{答治茜  (dazhiqian@gmail.com)}
\title{\textbf{转换 ~\textit{StarDict} 字典格式到~
    \textit{F.O.L.D.O.C.}}\footnote{Copyright \copyright{  ada 2007}}}
 \date{\today{}}
%% -----------------------------------------------------

\begin{document}
\begin{CJK*}{UTF8}{rm}
  \hypersetup{pdfauthor={答治茜~~(dazhiqian@gmail.com)}
    pdftitle={\textbf{转换字典格式}}}
  
  \maketitle
  \begin{abstract}
    在介绍~\textit{StarDict}~和~\textit{dictd F.O.L.D.O.C.}~字典格式的基础
    上，提出了如何实现二者相互转换，最后文中给出了完整的代码实
    现~\textit{sd2foldoc}。
  \end{abstract}
  \tableofcontents{}
  
\section{为何需要转换？}

\textit{stardict}~是胡正（\verb|huzheng_001@163.com|）开发的一
套~\textit{Linux}~平台下的自由软件，他可以为用户提供单词查询服务，拥有
非常丰富的字典资源；\textit{dictd}~是~\textit{Linux~}~平台下标准的字典
服务~\textit{Daemon}，可以在很多时候见到它的身影。很多时候我们并不想利
用~\textit{stardict}~来完成我们的查询任务（比如脚
本，\textit{Emacs}等），可能~\textbf{dict, dictd}~更能满足我们的需求，但
是非常可惜的是~\textit{dictd}~能够直接利用的中文字典资源非常稀缺，所以
我就想能不能把~\textit{stardict}~的字典转换成~\textit{dictd}~的字典格
式。

\section{\textbf{stardict}~字典格式}

\textit{stardict}~字典文件主要由~\textit{*.dict, *.idx, *.ifo}~组成
（其实并不是这样，这是最简单的格式），\textit{*.dict}~是UTF-8编码的纯
数据文件，里面存放~\textit{headwords}~的定
义，\textit{*.idx}~是~\textit{headwords}~的索引，而~\textit{*.ifo}~主
要描述字典的本身属性，例如多少个~\textit{headwords}~，制作者等信息。

其中~\textit{*.idx}~是整个字典的关键，他的结构如下：

The .idx file is just a word list. The word list is a sorted list of
word entries. Each entry in the word list contains three fields, one
after the other:
\begin{itemize}
\item \verb|word_str|
  \begin{itemize}
  \item a utf-8 string terminated by `$\backslash$0'.
  \end{itemize}
\item \verb|word_data_offset|
  \begin{itemize}
  \item word data's offset in .dict file.
  \end{itemize}
\item \verb|word_data_size|
  \begin{itemize}
  \item word data's total size in .dict file.
  \end{itemize}
\end{itemize} 
\verb|word_str| gives the string representing this word.
It's the string that is "looked up" by the StarDict.

当然完整的~\textit{stardict}~格式定义比这个复杂些，我们先从最简单的入
手（假设sametypesequence＝m\footnote{请参考
~http://stardict.sourceforge.net/}），到此~\textit{stardict}~字典的格
式我们就大概了解了，他在\textit{*.idx}文件中找到用户想查询的单词
\verb|word_str|，然后根据查到
的~\verb|word_data_offset|~和~\verb|word_data_size|~来定
位~\textit{*.dict}~中关于该单词的解释。

\section{\textbf{dictd}~字典格式}

\textit{dictd}~的字典格式我没有特意来研究，我只了解了那些格式可以转换
为~\textit{dictd}~字典格式，其中让我感兴趣的
是~F.O.L.D.O.C.\footnote{man dictfmt}~格式。这种格式非常简单，就是用纯
文本文件来存贮整个字典定义，格式如下：
\begin{itemize}
\item headwords start in col 0, definitions start in col 8 
\end{itemize}

\section{转换为~F.O.L.D.O.C.~格式}

转换的思想就是依次分析~\textit{*.idx}~文件，找到每个~\textit{headwods}~和
它的定义，然后按照~\textit{F.O.L.D.O.C.}~格式写入~txt~文件即可。

代码实现
\footnote{http://dazhiqian.googlecode.com/svn/trunk/C/dictd-dabase/sd2foldoc/}。

\section{F.O.L.D.O.C.~格式到~dictd~格式}

有了~F.O.L.D.O.C~格式的字典定义，转换成为~dictd~使用的字典格式就相当简单，命
令如下：
\begin{itemize}
\item cat dict.txt |dictfmt -f -s "字典描述" --utf8 --allchars  dictname
\end{itemize}

之后把生成的~\textit{*.dict}~和~\textit{*.index}~文件~mv~到~dictd~的字
典目录，用dictdconfig命令来刷新字典配置，
\begin{itemize}
\item dictdconfig -l\footnote{查看字典}
\item dictdconfig -w\footnote{刷新字典配置}
\end{itemize}
重启~dictd~，ok， 大功告成。

\section{测试}

可以这样来测试你安装的字典是否可用：
\begin{itemize}
\item telnet localhost 2628
\item DEFINE dictname hello
\end{itemize}

或者你还可以这样来测试

\begin{itemize}
\item dict -d localhost -D \footnote{验证~dictname~字典是否存在}
\item dict -h localhost hello \footnote{查询~hello~的中文解释}
\end{itemize}


\large{\textbf{Enjoy Yourself.}}

\end{CJK*}
\end{document}

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t
%%% End: 
